home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / cpu / m6805 / 6805dasm.c next >
C/C++ Source or Header  |  1999-06-10  |  12KB  |  248 lines

  1. /*
  2.  *   A quick-hack 68(7)05 disassembler
  3.  *
  4.  *   Note: this is not the good and proper way to disassemble anything, but it works
  5.  *
  6.  *   I'm afraid to put my name on it, but I feel obligated:
  7.  *   This code written by Aaron Giles (agiles@sirius.com) for the MAME project
  8.  *
  9.  */
  10.  
  11. #include <string.h>
  12.  
  13. #ifdef MAME_DEBUG
  14.  
  15. #include <stdio.h>
  16. #include "cpuintrf.h"
  17. #include "mamedbg.h"
  18. #include "m6805.h"
  19.  
  20. enum addr_mode {
  21.     _imp=0,     /* implicit */
  22.     _btr,        /* bit test and relative */
  23.     _bit,        /* bit set/clear */
  24.     _rel,        /* relative */
  25.     _imm,        /* immediate */
  26.     _dir,        /* direct address */
  27.     _ext,        /* extended address */
  28.     _idx,        /* indexed */
  29.     _ix1,        /* indexed + byte offset */
  30.     _ix2        /* indexed + word offset */
  31. };
  32.  
  33. enum op_names {
  34.     adca=0, adda,    anda,    asl,    asla,    aslx,    asr,    asra,
  35.     asrx,    bcc,    bclr,    bcs,    beq,    bhcc,    bhcs,    bhi,
  36.     bih,    bil,    bita,    bls,    bmc,    bmi,    bms,    bne,
  37.     bpl,    bra,    brclr,    brn,    brset,    bset,    bsr,    clc,
  38.     cli,    clr,    clra,    clrx,    cmpa,    com,    coma,    comx,
  39.     cpx,    dec,    deca,    decx,    eora,    ill,    inc,    inca,
  40.     incx,    jmp,    jsr,    lda,    ldx,    lsr,    lsra,    lsrx,
  41.     neg,    nega,    negx,    nop,    ora,    rol,    rola,    rolx,
  42.     ror,    rora,    rorx,    rsp,    rti,    rts,    sbca,    sec,
  43.     sei,    sta,    stx,    suba,    swi,    tax,    tst,    tsta,
  44.     tstx,    txa
  45. };
  46.  
  47. static const char *op_name_str[] = {
  48.     "adca", "adda", "anda", "asl",  "asla", "aslx", "asr",  "asra",
  49.     "asrx", "bcc",  "bclr", "bcs",  "beq",  "bhcc", "bhcs", "bhi",
  50.     "bih",  "bil",  "bita", "bls",  "bmc",  "bmi",  "bms",  "bne",
  51.     "bpl",  "bra",  "brclr","brn",  "brset","bset", "bsr",  "clc",
  52.     "cli",  "clr",  "clra", "clrx", "cmpa", "com",  "coma", "comx",
  53.     "cpx",  "dec",  "deca", "decx", "eora", "*ill", "inc",  "inca",
  54.     "incx", "jmp",  "jsr",  "lda",  "ldx",  "lsr",  "lsra", "lsrx",
  55.     "neg",  "nega", "negx", "nop",  "ora",  "rol",  "rola", "rolx",
  56.     "ror",  "rora", "rorx", "rsp",  "rti",  "rts",  "sbca", "sec",
  57.     "sei",  "sta",  "stx",  "suba", "swi",  "tax",  "tst",  "tsta",
  58.     "tstx", "txa"
  59. };
  60.  
  61. #define _0        0,0
  62. #define _bra    0,EA_REL_PC
  63. #define _jmp    0,EA_ABS_PC
  64. #define _zrd    EA_UINT8,EA_ZPG_RD
  65. #define _zwr    EA_UINT8,EA_ZPG_WR
  66. #define _zrw    EA_UINT8,EA_ZPG_RDWR
  67. #define _mrd    EA_UINT8,EA_MEM_RD
  68. #define _mwr    EA_UINT8,EA_MEM_WR
  69. #define _mrw    EA_UINT8,EA_MEM_RDWR
  70.  
  71. const unsigned char disasm[0x100][4] = {
  72.     {brset,_btr,_zrd},{brclr,_btr,_zrd},{brset,_btr,_zrd},{brclr,_btr,_zrd},/* 00 */
  73.     {brset,_btr,_zrd},{brclr,_btr,_zrd},{brset,_btr,_zrd},{brclr,_btr,_zrd},
  74.     {brset,_btr,_zrd},{brclr,_btr,_zrd},{brset,_btr,_zrd},{brclr,_btr,_zrd},
  75.     {brset,_btr,_zrd},{brclr,_btr,_zrd},{brset,_btr,_zrd},{brclr,_btr,_zrd},
  76.     {bset, _bit,_zwr},{bclr, _bit,_zwr},{bset, _bit,_zwr},{bclr, _bit,_zwr},/* 10 */
  77.     {bset, _bit,_zwr},{bclr, _bit,_zwr},{bset, _bit,_zwr},{bclr, _bit,_zwr},
  78.     {bset, _bit,_zwr},{bclr, _bit,_zwr},{bset, _bit,_zwr},{bclr, _bit,_zwr},
  79.     {bset, _bit,_zwr},{bclr, _bit,_zwr},{bset, _bit,_zwr},{bclr, _bit,_zwr},
  80.     {bra,  _rel,_bra},{brn,  _rel,_bra},{bhi,  _rel,_bra},{bls,  _rel,_bra},/* 20 */
  81.     {bcc,  _rel,_bra},{bcs,  _rel,_bra},{bne,  _rel,_bra},{beq,  _rel,_bra},
  82.     {bhcc, _rel,_bra},{bhcs, _rel,_bra},{bpl,  _rel,_bra},{bmi,  _rel,_bra},
  83.     {bmc,  _rel,_bra},{bms,  _rel,_bra},{bil,  _rel,_bra},{bih,  _rel,_bra},
  84.     {neg,  _dir,_zrw},{ill,  _imp,_0  },{ill,  _imp,_0    },{com,  _dir,_zrw},/* 30 */
  85.     {lsr,  _dir,_zrw},{ill,  _imp,_0  },{ror,  _dir,_zrw},{asr,  _dir,_zrw},
  86.     {asl,  _dir,_zrw},{rol,  _dir,_zrw},{dec,  _dir,_zrw},{ill,  _imp,_0  },
  87.     {inc,  _dir,_zrw},{tst,  _dir,_zrd},{ill,  _imp,_0    },{clr,  _dir,_zwr},
  88.     {nega, _imp,_0    },{ill,  _imp,_0  },{ill,  _imp,_0    },{coma, _imp,_0  },/* 40 */
  89.     {lsra, _imp,_0    },{ill,  _imp,_0  },{rora, _imp,_0    },{asra, _imp,_0  },
  90.     {asla, _imp,_0    },{rola, _imp,_0  },{deca, _imp,_0    },{ill,  _imp,_0  },
  91.     {inca, _imp,_0    },{tsta, _imp,_0  },{ill,  _imp,_0    },{clra, _imp,_0  },
  92.     {negx, _imp,_0    },{ill,  _imp,_0  },{ill,  _imp,_0    },{comx, _imp,_0  },/* 50 */
  93.     {lsrx, _imp,_0    },{ill,  _imp,_0  },{rorx, _imp,_0    },{asrx, _imp,_0  },
  94.     {aslx, _imp,_0    },{rolx, _imp,_0  },{decx, _imp,_0    },{ill,  _imp,_0  },
  95.     {incx, _imp,_0    },{tstx, _imp,_0  },{ill,  _imp,_0    },{clrx, _imp,_0  },
  96.     {neg,  _ix1,_zrw},{ill,  _imp,_0  },{ill,  _imp,_0    },{com,  _ix1,_zrw},/* 60 */
  97.     {lsr,  _ix1,_zrw},{ill,  _imp,_0  },{ror,  _ix1,_zrw},{asr,  _ix1,_zrw},
  98.     {asl,  _ix1,_zrw},{rol,  _ix1,_zrw},{dec,  _ix1,_zrw},{ill,  _imp,_0  },
  99.     {inc,  _ix1,_zrw},{tst,  _ix1,_zrw},{jmp,  _ix1,_jmp},{clr,  _ix1,_zwr},
  100.     {neg,  _idx,_mrw},{ill,  _imp,_0  },{ill,  _imp,_0    },{com,  _idx,_mrw},/* 70 */
  101.     {lsr,  _idx,_mrw},{ill,  _imp,_0  },{ror,  _idx,_mrw},{asr,  _idx,_mrw},
  102.     {asl,  _idx,_mrw},{rol,  _idx,_mrw},{dec,  _idx,_mrw},{ill,  _imp,_0  },
  103.     {inc,  _idx,_mrw},{tst,  _idx,_mrd},{jmp,  _idx,_jmp},{clr,  _idx,_mwr},
  104.     {rti,  _imp,_0    },{rts,  _imp,_0  },{ill,  _imp,_0    },{swi,  _imp,_0  },/* 80 */
  105.     {ill,  _imp,_0    },{ill,  _imp,_0  },{ill,  _imp,_0    },{ill,  _imp,_0  },
  106.     {ill,  _imp,_0    },{ill,  _imp,_0  },{ill,  _imp,_0    },{ill,  _imp,_0  },
  107.     {ill,  _imp,_0    },{ill,  _imp,_0  },{ill,  _imp,_0    },{ill,  _imp,_0  },
  108.     {ill,  _imp,_0    },{ill,  _imp,_0  },{ill,  _imp,_0    },{ill,  _imp,_0  },/* 90 */
  109.     {ill,  _imp,_0    },{ill,  _imp,_0  },{ill,  _imp,_0    },{tax,  _imp,_0  },
  110.     {clc,  _imp,_0    },{sec,  _imp,_0  },{cli,  _imp,_0    },{sei,  _imp,_0  },
  111.     {rsp,  _imp,_0    },{nop,  _imp,_0  },{ill,  _imp,_0    },{txa,  _imp,_0  },
  112.     {suba, _imm,_0    },{cmpa, _imm,_0  },{sbca, _imm,_0    },{cpx,  _imm,_0  },/* a0 */
  113.     {anda, _imm,_0    },{bita, _imm,_0  },{lda,  _imm,_0    },{ill,  _imp,_0  },
  114.     {eora, _imm,_0    },{adca, _imm,_0  },{ora,  _imm,_0    },{adda, _imm,_0  },
  115.     {ill,  _imp,_0    },{bsr,  _rel,_bra},{ldx,  _imm,_0    },{ill,  _imp,_0  },
  116.     {suba, _dir,_zrd},{cmpa, _dir,_zrd},{sbca, _dir,_zrd},{cpx,  _dir,_zrd},/* b0 */
  117.     {anda, _dir,_zrd},{bita, _dir,_zrd},{lda,  _dir,_zrd},{sta,  _dir,_zwr},
  118.     {eora, _dir,_zrd},{adca, _dir,_zrd},{ora,  _dir,_zrd},{adda, _dir,_zrd},
  119.     {jmp,  _dir,_zrd},{jsr,  _dir,_jmp},{ldx,  _dir,_zrd},{stx,  _dir,_zwr},
  120.     {suba, _ext,_mrd},{cmpa, _ext,_mrd},{sbca, _ext,_mrd},{cpx,  _ext,_mrd},/* c0 */
  121.     {anda, _ext,_mrd},{bita, _ext,_mrd},{lda,  _ext,_mrd},{sta,  _ext,_mwr},
  122.     {eora, _ext,_mrd},{adca, _ext,_mrd},{ora,  _ext,_mrd},{adda, _ext,_mrd},
  123.     {jmp,  _ext,_jmp},{jsr,  _ext,_jmp},{ldx,  _ext,_mrd},{stx,  _ext,_mwr},
  124.     {suba, _ix2,_mrd},{cmpa, _ix2,_mrd},{sbca, _ix2,_mrd},{cpx,  _ix2,_mrd},/* d0 */
  125.     {anda, _ix2,_mrd},{bita, _ix2,_mrd},{lda,  _ix2,_mrd},{sta,  _ix2,_mwr},
  126.     {eora, _ix2,_mrd},{adca, _ix2,_mrd},{ora,  _ix2,_mrd},{adda, _ix2,_mrd},
  127.     {jmp,  _ix2,_jmp},{jsr,  _ix2,_jmp},{ldx,  _ix2,_mrd},{stx,  _ix2,_mwr},
  128.     {suba, _ix1,_zrd},{cmpa, _ix1,_zrd},{sbca, _ix1,_zrd},{cpx,  _ix1,_zrd},/* e0 */
  129.     {anda, _ix1,_zrd},{bita, _ix1,_zrd},{lda,  _ix1,_zrd},{sta,  _ix1,_zwr},
  130.     {eora, _ix1,_zrd},{adca, _ix1,_zrd},{ora,  _ix1,_zrd},{adda, _ix1,_zrd},
  131.     {jmp,  _ix1,_jmp},{jsr,  _ix1,_jmp},{ldx,  _ix1,_zrd},{stx,  _ix1,_zwr},
  132.     {suba, _idx,_mrd},{cmpa, _idx,_mrd},{sbca, _idx,_mrd},{cpx,  _idx,_mrd},/* f0 */
  133.     {anda, _idx,_mrd},{bita, _idx,_mrd},{lda,  _idx,_mrd},{sta,  _idx,_mwr},
  134.     {eora, _idx,_mrd},{adca, _idx,_mrd},{ora,  _idx,_mrd},{adda, _idx,_mrd},
  135.     {jmp,  _idx,_jmp},{jsr,  _idx,_jmp},{ldx,  _idx,_mrd},{stx,  _idx,_mwr}
  136. };
  137.  
  138. #if 0
  139. static char *opcode_strings[0x0100] =
  140. {
  141.     "brset0",     "brclr0",     "brset1",     "brclr1",     "brset2",     "brclr2",    "brset3",    "brclr3",        /*00*/
  142.     "brset4",    "brclr4",    "brset5",    "brclr5",    "brset6",    "brclr6",    "brset7",    "brclr7",
  143.     "bset0",    "bclr0",    "bset1",     "bclr1",     "bset2",     "bclr2",     "bset3",    "bclr3",        /*10*/
  144.     "bset4",     "bclr4",    "bset5",     "bclr5",    "bset6",     "bclr6",     "bset7",     "bclr7",
  145.     "bra",        "brn",        "bhi",        "bls",        "bcc",        "bcs",        "bne",        "beq",            /*20*/
  146.     "bhcc",        "bhcs",        "bpl",        "bmi",        "bmc",        "bms",        "bil",        "bih",
  147.     "neg_di",   "illegal",  "illegal",  "com_di",   "lsr_di",   "illegal",  "ror_di",   "asr_di",       /*30*/
  148.     "asl_di",    "rol_di",    "dec_di",    "illegal",     "inc_di",    "tst_di",    "illegal",     "clr_di",
  149.     "nega",        "illegal",     "illegal",     "coma",        "lsra",        "illegal",     "rora",        "asra",            /*40*/
  150.     "asla",        "rola",        "deca",        "illegal",     "inca",        "tsta",        "illegal",     "clra",
  151.     "negx",        "illegal",     "illegal",     "comx",        "lsrx",        "illegal",     "rorx",        "asrx",            /*50*/
  152.     "aslx",        "rolx",        "decx",        "illegal",     "incx",        "tstx",        "illegal",     "clrx",
  153.     "neg_ix1",    "illegal",     "illegal",     "com_ix1",    "lsr_ix1",    "illegal",     "ror_ix1",    "asr_ix1",        /*60*/
  154.     "asl_ix1",    "rol_ix1",    "dec_ix1",    "illegal",     "inc_ix1",    "tst_ix1",    "jmp_ix1",    "clr_ix1",
  155.     "neg_ix",    "illegal",     "illegal",     "com_ix",    "lsr_ix",    "illegal",     "ror_ix",    "asr_ix",        /*70*/
  156.     "asl_ix",    "rol_ix",    "dec_ix",    "illegal",     "inc_ix",    "tst_ix",    "jmp_ix",    "clr_ix",
  157.     "rti",        "rts",        "illegal",    "swi",        "illegal",    "illegal",    "illegal",    "illegal",        /*80*/
  158.     "illegal",    "illegal",    "illegal",    "illegal",    "illegal",    "illegal",    "illegal",    "illegal",
  159.     "illegal",    "illegal",    "illegal",    "illegal",    "illegal",    "illegal",    "illegal",    "tax",            /*90*/
  160.     "clc",        "sec",        "cli",        "sei",        "rsp",        "nop",        "illegal",    "txa",
  161.     "suba_im",    "cmpa_im",    "sbca_im",    "cpx_im",     "anda_im",    "bita_im",    "lda_im",    "illegal",        /*A0*/
  162.     "eora_im",    "adca_im",    "ora_im",    "adda_im",    "illegal",    "bsr",        "ldx_im",    "illegal",
  163.     "suba_di",    "cmpa_di",    "sbca_di",    "cpx_di",     "anda_di",    "bita_di",    "lda_di",    "sta_di",        /*B0*/
  164.     "eora_di",    "adca_di",    "ora_di",    "adda_di",    "jmp_di",    "jsr_di",    "ldx_di",    "stx_di",
  165.     "suba_ex",    "cmpa_ex",    "sbca_ex",    "cpx_ex",     "anda_ex",    "bita_ex",    "lda_ex",    "sta_ex",        /*C0*/
  166.     "eora_ex",    "adca_ex",    "ora_ex",    "adda_ex",    "jmp_ex",    "jsr_ex",    "ldx_ex",    "stx_ex",
  167.     "suba_ix2",    "cmpa_ix2",    "sbca_ix2",    "cpx_ix2",     "anda_ix2",    "bita_ix2",    "lda_ix2",    "sta_ix2",        /*D0*/
  168.     "eora_ix2",    "adca_ix2",    "ora_ix2",    "adda_ix2",    "jmp_ix2",    "jsr_ix2",    "ldx_ix2",    "stx_ix2",
  169.     "suba_ix1",    "cmpa_ix1",    "sbca_ix1",    "cpx_ix1",     "anda_ix1",    "bita_ix1",    "lda_ix1",    "sta_ix1",        /*E0*/
  170.     "eora_ix1",    "adca_ix1",    "ora_ix1",    "adda_ix1",    "jmp_ix1",    "jsr_ix1",    "ldx_ix1",    "stx_ix1",
  171.     "suba_ix",    "cmpa_ix",    "sbca_ix",    "cpx_ix",     "anda_ix",    "bita_ix",    "lda_ix",    "sta_ix",        /*F0*/
  172.     "eora_ix",    "adca_ix",    "ora_ix",    "adda_ix",    "jmp_ix",    "jsr_ix",    "ldx_ix",    "stx_ix"
  173. };
  174. #endif
  175.  
  176. unsigned Dasm6805 (char *buf, unsigned pc)
  177. {
  178.     const char *sym1, *sym2;
  179.     int code, bit;
  180.     unsigned addr, ea, size, access;
  181.  
  182.     code = cpu_readop(pc);
  183.     size = disasm[code][2];
  184.     access = disasm[code][3];
  185.  
  186.     buf += sprintf(buf, "%-6s", op_name_str[disasm[code][0]]);
  187.  
  188.     switch( disasm[code][1] )
  189.     {
  190.     case _btr:    /* bit test and relative branch */
  191.         bit = (code >> 1) & 7;
  192.         ea = cpu_readop_arg(pc+1);
  193.         sym1 = set_ea_info(1, ea, EA_UINT8, EA_ZPG_RD);
  194.         sym2 = set_ea_info(0, pc + 3, (INT8)cpu_readop_arg(pc+2), EA_REL_PC);
  195.         sprintf (buf, "%d,%s,%s", bit, sym1, sym2);
  196.         return 3;
  197.     case _bit:    /* bit test */
  198.         bit = (code >> 1) & 7;
  199.         ea = cpu_readop_arg(pc+1);
  200.         sym1 = set_ea_info(1, ea, EA_UINT8, EA_MEM_RD);
  201.         sprintf (buf, "%d,%s", bit, sym1);
  202.         return 2;
  203.     case _rel:    /* relative */
  204.         sym1 = set_ea_info(0, pc + 2, (INT8)cpu_readop_arg(pc+1), access);
  205.         sprintf (buf, "%s", sym1);
  206.         return 2;
  207.     case _imm:    /* immediate */
  208.         sym1 = set_ea_info(0, cpu_readop_arg(pc+1), EA_UINT8, EA_VALUE);
  209.         sprintf (buf, "#%s", sym1);
  210.         return 2;
  211.     case _dir:    /* direct (zero page address) */
  212.         addr = cpu_readop_arg(pc+1);
  213.         ea = addr;
  214.         sym1 = set_ea_info(1, ea, size, access);
  215.         sprintf (buf, "%s", sym1);
  216.         return 2;
  217.     case _ext:    /* extended (16 bit address) */
  218.         addr = (cpu_readop_arg(pc+1) << 8) + cpu_readop_arg(pc+2);
  219.         ea = addr;
  220.         sym1 = set_ea_info(1, ea, size, access);
  221.         sprintf (buf, "%s", sym1);
  222.         return 3;
  223.     case _idx:    /* indexed */
  224.         ea = m6805_get_reg(M6805_X);
  225.         set_ea_info(0, ea, size, access);
  226.         sprintf (buf, "(x)");
  227.         return 1;
  228.     case _ix1:    /* indexed + byte (zero page) */
  229.         addr = cpu_readop_arg(pc+1);
  230.         ea = (addr + cpu_get_reg(M6805_X)) & 0xff;
  231.         sym1 = set_ea_info(0, addr, EA_UINT8, EA_VALUE);
  232.         sym2 = set_ea_info(0, ea, size, access);
  233.         sprintf (buf, "(x+%s)", sym1);
  234.         return 2;
  235.     case _ix2:    /* indexed + word (16 bit address) */
  236.         addr = (cpu_readop_arg(pc+1) << 8) + cpu_readop_arg(pc+2);
  237.         ea = (addr + cpu_get_reg(M6805_X)) & 0xffff;
  238.         sym1 = set_ea_info(0, addr, EA_UINT16, EA_VALUE);
  239.         sym2 = set_ea_info(0, ea, size, access);
  240.         sprintf (buf, "(x+%s)", sym1);
  241.         return 3;
  242.     default:    /* implicit */
  243.         return 1;
  244.     }
  245. }
  246.  
  247. #endif
  248.